<?php

/**
 * Summary
 * 
 * Sesion Handler para PHP5 / Sf2
 * 
 * Esta clase implementa los métodos basico de la interfaz estadar de PHP
 * \SessionHandlerInterface para el manejo de sesiones de PHP, puede ser usada 
 * directamente por PHP5 al registrarla como SessionHandler o por medio de SF2.
 * 
 * Permite utilizar cualquiera de los adaptadores para cache por el SessionHandler.
 */
namespace SubMemory\Cache;

use SubMemory\Cache\CacheInterface;
use SubMemory\Cache\Cache;



/**
 * Esta clase permite utilizar cualquiera de los adaptadores de caches de 
 * LibAuthPrv en el SessionHandler de PHP5 esta implementada a partir de la 
 * interfaz estandar \SessionHandlerInterface respetando la manera en que son 
 * escritas y usadas por Symfony2.
 *
 * 
 */
class CacheSessionHandler implements \SessionHandlerInterface{
    /**
     * Instancia del Cache bridge
     * @var Cache 
     */
     private $cache = null;
     /**
      * Tiempo de expiración usada en el colector de basura.
      * @var int
      */
     private $ttl = 3600;
     /**
      * Prefijo usado por Synfony2 para distinguir su sesión.
      * @var string 
      */
     private $prefix = "sf2s";
    
    /**
     * Constructor
     * @param \Previsora\AuthPrv\Cache\CacheInterface $cache
     * @param array $options
     * @return boolean
     * @throws \InvalidArgumentException
     */
     public function __construct(CacheInterface $cache,array $options = array()) {
               
         
            session_set_save_handler($this, true);
            register_shutdown_function("session_write_close");
                   
            
            $this->cache = new Cache($cache);
            
            //$maxlifetime= intval(ini_get("session.gc_maxlifetime")); 
         
            if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) {
               throw new \InvalidArgumentException(sprintf(
                 'The following options are not supported "%s"', implode(', ', $diff)
              ));
            }
            $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400;
            $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s';

            return true;
        }
    
    
        
    /**
     * abstract public bool close ( void )
     * @return boolean
     */    
    public function close(){
        $result = @$this->cache->close();
        return $result;
    }
    
    /**
     * abstract public bool destroy ( string $session_id ){}
     * @param string $session_id
     * @return boolean
     */
    public function destroy($session_id){
        return @$this->cache->delete($this->prefix.$session_id);
    }
    
    /**
     * abstract public bool gc ( string $maxlifetime ){}
     * @param int $maxlifetime
     * @return boolean
     */
    public function gc($maxlifetime) {
        return $this->cache->gc($maxlifetime);
        //return TRUE;
    }
    
    /**
     * abstract public bool open ( string $save_path , string $name ){}
     * @param string $save_path
     * @param string $name
     * @return boolean
     */
    public function open($save_path, $name) {
        $result = TRUE;
        return $result;
    }
    
    
    /**
     * abstract public string read ( string $session_id ){}
     * @param string $session_id
     * @return string
     */
    public function read($session_id) {
        return (string)@$this->cache->get($this->prefix.$session_id);
        
    }
    
    /**
     * abstract public bool write ( string $session_id , string $session_data ){}
     * 
     * @param string $session_id
     * @param string $session_data
     * @return boolean
     */
    public function write($session_id, $session_data) {
        
        
        return @$this->cache->set($this->prefix.$session_id,$session_data, time() + $this->ttl) === false ? false : true;
        
    }
}

?>
